﻿
#region Usings
using System.Collections.Generic;
using System.Net.Mail;
using System.Net.Mime;
using System.Threading;
#endregion

namespace LongNet.Web.Email.SMTP
{
    /// <summary>
    /// Utility for sending an email
    /// </summary>
    public class EmailSender : Message
    {
        #region Constructors

        /// <summary>
        /// Default Constructor
        /// </summary>
        public EmailSender()
        {
            Attachments = new List<Attachment>();
            EmbeddedResources = new List<LinkedResource>();
            Priority = MailPriority.Normal;
        }

        #endregion

        #region Public Functions

        /// <summary>
        /// Sends an email
        /// </summary>
        /// <param name="Message">The body of the message</param>
        public void SendMail(string Message)
        {
            Body = Message;
            SendMail();
        }

        /// <summary>
        /// Sends a piece of mail asynchronous
        /// </summary>
        /// <param name="Message">Message to be sent</param>
        public void SendMailAsync(string Message)
        {
            Body = Message;
            ThreadPool.QueueUserWorkItem(delegate { SendMail(); });
        }

        /// <summary>
        /// Sends an email
        /// </summary>
        public void SendMail()
        {
            using (System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage())
            {
                char[] Splitter = { ',' };
                string[] AddressCollection = To.Split(Splitter);
                for (int x = 0; x < AddressCollection.Length; ++x)
                {
                    message.To.Add(AddressCollection[x]);
                }
                if (!string.IsNullOrEmpty(CC))
                {
                    AddressCollection = CC.Split(Splitter);
                    for (int x = 0; x < AddressCollection.Length; ++x)
                    {
                        message.CC.Add(AddressCollection[x]);
                    }
                }
                if (!string.IsNullOrEmpty(Bcc))
                {
                    AddressCollection = Bcc.Split(Splitter);
                    for (int x = 0; x < AddressCollection.Length; ++x)
                    {
                        message.Bcc.Add(AddressCollection[x]);
                    }
                }
                message.Subject = Subject;
                message.From = new System.Net.Mail.MailAddress((From));
                AlternateView BodyView = AlternateView.CreateAlternateViewFromString(Body, null, MediaTypeNames.Text.Html);
                foreach (LinkedResource Resource in EmbeddedResources)
                {
                    BodyView.LinkedResources.Add(Resource);
                }
                message.AlternateViews.Add(BodyView);
                //message.Body = Body;
                message.Priority = Priority;
                message.SubjectEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
                message.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
                message.IsBodyHtml = true;
                foreach (Attachment TempAttachment in Attachments)
                {
                    message.Attachments.Add(TempAttachment);
                }
                System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(Server, Port);
                if (!string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(Password))
                {
                    smtp.Credentials = new System.Net.NetworkCredential(UserName, Password);
                }
                if (UseSSL)
                    smtp.EnableSsl = true;
                else
                    smtp.EnableSsl = false;
                smtp.Send(message);
            }
        }

        /// <summary>
        /// Sends a piece of mail asynchronous
        /// </summary>
        public void SendMailAsync()
        {
            ThreadPool.QueueUserWorkItem(delegate { SendMail(); });
        }

        #endregion

        #region Properties

        /// <summary>
        /// Any attachments that are included with this
        /// message.
        /// </summary>
        public List<Attachment> Attachments { get; set; }

        /// <summary>
        /// Any attachment (usually images) that need to be embedded in the message
        /// </summary>
        public List<LinkedResource> EmbeddedResources { get; set; }

        /// <summary>
        /// The priority of this message
        /// </summary>
        public MailPriority Priority { get; set; }

        /// <summary>
        /// Server Location
        /// </summary>
        public string Server { get; set; }

        /// <summary>
        /// User Name for the server
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// Password for the server
        /// </summary>
        public string Password { get; set; }

        /// <summary>
        /// Port to send the information on
        /// </summary>
        public int Port { get; set; }

        /// <summary>
        /// Decides whether we are using STARTTLS (SSL) or not
        /// </summary>
        public bool UseSSL { get; set; }

        /// <summary>
        /// Carbon copy send (seperate email addresses with a comma)
        /// </summary>
        public string CC { get; set; }

        /// <summary>
        /// Blind carbon copy send (seperate email addresses with a comma)
        /// </summary>
        public string Bcc { get; set; }

        #endregion
    }
}